filesystemmodel: Add a toggle for whether directories are filtered
authorBenjamin Otte <otte@redhat.com>
Mon, 7 Nov 2011 14:18:40 +0000 (15:18 +0100)
committerBenjamin Otte <otte@redhat.com>
Fri, 16 Dec 2011 19:09:14 +0000 (20:09 +0100)
gtk/gtkfilesystemmodel.c
gtk/gtkfilesystemmodel.h

index 15497e645fcc2d0429f7cc8585869417c91cae23..7cfc5a156739d4089769f874394d1bf4110ca769 100644 (file)
@@ -169,6 +169,7 @@ struct _GtkFileSystemModel
   guint                 show_hidden :1; /* whether to show hidden files */
   guint                 show_folders :1;/* whether to show folders */
   guint                 show_files :1;  /* whether to show files */
+  guint                 filter_folders :1;/* whether filter applies to folders */
 };
 
 #define GTK_FILE_SYSTEM_MODEL_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_FILE_SYSTEM_MODEL, GtkFileSystemModelClass))
@@ -340,7 +341,7 @@ node_should_be_visible (GtkFileSystemModel *model, guint id)
   FileModelNode *node = get_node (model, id);
   GtkFileFilterInfo filter_info = { 0, };
   GtkFileFilterFlags required;
-  gboolean is_folder, result;
+  gboolean result;
   char *mime_type = NULL;
   char *filename = NULL;
   char *uri = NULL;
@@ -352,15 +353,19 @@ node_should_be_visible (GtkFileSystemModel *model, guint id)
       (g_file_info_get_is_hidden (node->info) || g_file_info_get_is_backup (node->info)))
     return FALSE;
 
-  is_folder = _gtk_file_info_consider_as_directory (node->info);
-  
-  /* wtf? */
-  if (model->show_folders != model->show_files &&
-      model->show_folders != is_folder)
-    return FALSE;
+  if (_gtk_file_info_consider_as_directory (node->info))
+    {
+      if (!model->show_folders)
+        return FALSE;
 
-  if (is_folder)
-    return TRUE;
+      if (!model->filter_folders)
+        return TRUE;
+    }
+  else
+    {
+      if (!model->show_files)
+        return FALSE;
+    }
 
   if (model->filter == NULL)
     return TRUE;
@@ -1035,6 +1040,7 @@ _gtk_file_system_model_init (GtkFileSystemModel *model)
   model->show_files = TRUE;
   model->show_folders = TRUE;
   model->show_hidden = FALSE;
+  model->filter_folders = FALSE;
 
   model->sort_column_id = GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID;
 
@@ -1473,6 +1479,30 @@ _gtk_file_system_model_set_show_files (GtkFileSystemModel *model,
     }
 }
 
+/**
+ * _gtk_file_system_model_set_filter_folders:
+ * @model: a #GtkFileSystemModel
+ * @filter_folders: whether the filter applies to folders
+ * 
+ * Sets whether the filter set by _gtk_file_system_model_set_filter()
+ * applies to folders. By default, it does not and folders are always
+ * visible.
+ **/
+void
+_gtk_file_system_model_set_filter_folders (GtkFileSystemModel *model,
+                                          gboolean            filter_folders)
+{
+  g_return_if_fail (GTK_IS_FILE_SYSTEM_MODEL (model));
+
+  filter_folders = filter_folders != FALSE;
+
+  if (filter_folders != model->filter_folders)
+    {
+      model->filter_folders = filter_folders;
+      gtk_file_system_model_refilter_all (model);
+    }
+}
+
 /**
  * _gtk_file_system_model_get_cancellable:
  * @model: the model
@@ -1815,7 +1845,8 @@ _gtk_file_system_model_update_file (GtkFileSystemModel *model,
  * @filter: (allow-none): %NULL or filter to use
  * 
  * Sets a filter to be used for deciding if a row should be visible or not.
- * Directories are always visible.
+ * Whether this filter applies to directories can be toggled with
+ * _gtk_file_system_model_set_filter_folders().
  **/
 void
 _gtk_file_system_model_set_filter (GtkFileSystemModel      *model,
index a6fbab936f4628fa0856b4c65087eaee25b4f51d..4a533daddb33cc572cc3ffb3352248971d6d5bf4 100644 (file)
@@ -80,6 +80,8 @@ void                _gtk_file_system_model_set_show_folders (GtkFileSystemModel
                                                             gboolean            show_folders);
 void                _gtk_file_system_model_set_show_files   (GtkFileSystemModel *model,
                                                             gboolean            show_files);
+void                _gtk_file_system_model_set_filter_folders (GtkFileSystemModel *model,
+                                                            gboolean            show_folders);
 void                _gtk_file_system_model_freeze_updates   (GtkFileSystemModel *model);
 void                _gtk_file_system_model_thaw_updates     (GtkFileSystemModel *model);
 void                _gtk_file_system_model_clear_cache      (GtkFileSystemModel *model,